#ifdef __MMI_DSM_NEW__
#include "MMI_features.h" 
#include "mrp_features.h"
#ifdef __MR_CFG_FEATURE_COOKIE_DOWNLOAD_PLATCODE__
#include "stdC.h"
#include "L4Dr1.h"
#include "PixtelDataTypes.h"

#include "gdi_features.h"
#include "gdi_internal.h"
#include "wgui_draw_manager.h"
#include "wgui_fixed_menuitems.h"
#include "wgui_categories_util.h"
#include "GlobalDefs.h"
#include "wgui_categories_inputs.h"
#include "HistoryGprot.h"
#include "ProtocolEvents.h"
#include "SMSApi.h"
#include "gdi_image_jpeg.h"
#include "mmi_msg_struct.h"
#include "PhoneBookProt.h"
#include "PhoneBookTypes.h"
#include "mdi_datatype.h"
#include "ScrMemMgrGprot.h"
#include "FileManagerGProt.h"
#include "med_utility.h"
#include "app2soc_struct.h"
#include "gpioInc.h"
#include "mrp_include.h"

#ifdef __MED_IN_ASM__
#define med_alloc_ext_mem(size) applib_asm_alloc_anonymous_nc(size)
#define med_alloc_ext_mem_cacheable(size) applib_asm_alloc_anonymous(size)
#define med_free_ext_mem(ptr) applib_asm_free_anonymous(*ptr)
#endif


typedef struct
{
	int32 soc;
	uint8 *pSendBuffer;
	uint8 *pRecvBuffer;
	uint8 *pTmp;
	uint8 *pFileName;
	uint8 *pParam;
	int32 Sended;
	int32 Recved;
	int32 totalLen;
	int32 flag;
	int32 recvState;
	int32 fh;
	int32 fileSize;
	int32 fileLeft;
	int32 showUI;
}T_AUTO_UPDATE;

enum
{
	DL_CONNECTING,
	DL_SENDING,
	DL_RECV_HTTP_HEADER,
	DL_RECV_DATA
};
static char g_dlc_cmd[20] = {"DownloadAppEx"};

//http://appidPlugin.fivesky.net:4010
static int32 g_dlc_server_port = 4010;
static char g_dlc_server[64] = {"appidPlugin.fivesky.net"};

//#define __USE_TEST_SERVER__

/* tst:http://115.238.91.240:10039/DownloadAppEx*/
//static int32 g_dlc_server_port = 10039;

/*
0:download cookie
1:download gb
*/
int32 g_dlc_flag = 0;
int32 g_dlc_ip = 0;
/**
* 记录是否需要下载曲奇或者GB码
*第一位GB码,第二位曲奇.
* 0:不需要下载,1:需要下载
**/
int32 g_dlc_need[2] = {0,0};
/*记录未获取到数据次数*/
#define DLC_TIMEROUT_TOTAL 60
int32 g_dlc_timeout = 0;
//当前盘符
char g_dlc_tmp0 = 0;

/**
* 需要组合进度
*0:不需要组合
*1:组合
*/
int32 g_dlc_meger_prograss = 0;

/**
* MRP多入口有可能是挂的函数,需要特殊处理.
*/
mr_app_entry_f g_dlc_app_func = 0;

extern char * dsmEntry;
static T_AUTO_UPDATE g_dlc_download_applist ={-1};


#define HTTP_HEADER  "POST http://%s:10039/%s HTTP/1.1\r\n\
Host: %s:10039\r\n\
X-Online-Host: %s:10039\r\n\
User-Agent: Nokia6681/2.0 (3.10.6) SymbianOS/8.0 Series60/2.6 Profile/MIDP-2.0 Configuration/CLDC-1.1\r\n\
Accept: */* \r\n\
Accept-Language: zh-cn\r\n\
Connection: Keep-Alive\r\n\
Proxy-Connection: Keep-Alive\r\n\
Pragma: no-cache\r\n\
Content-Type: application/x-www-form-urlencoded\r\n\
Content-Length: "




#define __DLC_INFO_SIZE 100
static char g_dlc_info[__DLC_INFO_SIZE] = {0};
static char g_dlc_progressInfo[__DLC_INFO_SIZE*2+2] = {0};

#define  GB_FILE_NAME  "gb2312.mrp"
#define  GB_FILE_NAME_1  "u16b_2312.bin"
#define  GB_FILE_NAME_2  "2312_u16be.bin"
#define  APPLIST_FILE_NAME  "cookie.mrp"
#define  APPLIST_PATH            "mythroad"

#define APS_MAX_FILENAME_SIZE  128

extern void mr_dlc_get_progress(int32 *total,int32* left);
extern void mr_dlc_exit_dl(void);

static int32 mr_dlc_applist(void);
int mr_dlc_check_applist(void);
static int32 mr_dlc_applist_initnet_cb(int32 ret);
static void mr_dlc_write_data(uint8 *data,int32 len);
static void mr_dlc_connect_server(void);
void mr_dlc_update_progress(int32 total,int32 left);


static U16 mr_dlc_AnsiiToUnicodeString(S8 *pOutBuffer, S8 *pInBuffer)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    kal_int16 count = -1;

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    while (*pInBuffer != '\0')
    {
        pOutBuffer[++count] = *pInBuffer;
        pOutBuffer[++count] = 0;
        pInBuffer++;
    }

    pOutBuffer[++count] = '\0';
    pOutBuffer[++count] = '\0';
    return count + 1;
}

#define mr_dlc_AnsiiToUnicodeString app_asc_str_to_ucs2_str
#define wcscat app_ucs2_strcat

static uint32 _ltoh(char * startAddr)
{
    return  (startAddr[3] << 24) | ((startAddr[2] & 0xff)<< 16)  | ((startAddr[1] & 0xff) << 8) | (startAddr[0] & 0xff);
}

#define SIZE_PER_TIME 4096
int32 mr_dlc_write_file(char* filename,int32 f,int32 bufferpos,int32 size)
{
	int32 ftemp = 0;
	char * buffer = 0;
	int32 leftsize = size;
	int32 getsize = 0;
	int32 oldpos = 0;
	
	oldpos = mr_fs_get_position(f);
	
	ftemp = FS_Open((wchar_t*)filename,FS_CREATE_ALWAYS|FS_READ_WRITE);
	if(ftemp >= 0)
	{
		buffer = (char*)med_alloc_ext_mem(SIZE_PER_TIME);
		if(buffer != NULL)
		{
			mr_seek(f,bufferpos,MR_SEEK_SET);
			while(leftsize > 0)
			{
				if(leftsize > SIZE_PER_TIME)
				{
					getsize = mr_read(f, buffer, SIZE_PER_TIME);
					mr_write(ftemp, buffer,getsize);
				} 
				else
				{
					getsize = mr_read(f, buffer, leftsize);
					mr_write(ftemp, buffer,getsize);
				}
				leftsize -= getsize;
			}
		}
		med_free_ext_mem((void**)&buffer);
	}
	mr_seek(f,oldpos-MR_PLAT_VALUE_BASE,MR_SEEK_SET);
	mr_close(ftemp);
	return MR_SUCCESS;
}

char g_dlc_temp_path[64] = {0};
char g_dlc_temp_path_ucs[128] = {0};
int32 mr_dle_write_file_short(char* filename,int32 f,int32 bufferpos,int32 size)
{
	memset(g_dlc_temp_path,0,64);
	memset(g_dlc_temp_path_ucs,0,128);
	g_dlc_temp_path[0] = g_dlc_tmp0;
	sprintf(g_dlc_temp_path+1,":\\mythroad\\system\\%s",filename);	
	mr_dlc_AnsiiToUnicodeString(g_dlc_temp_path_ucs,g_dlc_temp_path);
	mr_dlc_write_file(g_dlc_temp_path_ucs,f,bufferpos,size);
	
	return MR_SUCCESS;	
}
/*返回文件句柄*/
int32 GetFileFromMrp(char* packname)
{
	char _v[4]; 
	int32 file_len,len = 0;
	uint32 found = 0;
	char TempName[APS_MAX_FILENAME_SIZE];
	uint32 headbuf[4];
	int32 nTmp;
	int32 f;
	{
		f = FS_Open((wchar_t*)packname, FS_READ_ONLY );
		mr_seek(f,0,MR_SEEK_SET); 		 
		memset(headbuf, 0, sizeof(headbuf));
		nTmp = mr_read(f, &headbuf, sizeof(headbuf));

		headbuf[0] = _ltoh((char*)&headbuf[0]);/*文件标签"MRPG"*/
		headbuf[1] = _ltoh((char*)&headbuf[1]);/*文件头长度*/
		headbuf[2] = _ltoh((char*)&headbuf[2]);
		headbuf[3] = _ltoh((char*)&headbuf[3]);/*文件索引偏移*/

		{                             //新版mrp 
	               uint32 indexlen = headbuf[1] + 8 - headbuf[3];//文件索引长度
	               uint8* indexbuf = (kal_uint8*)med_alloc_ext_mem(indexlen);
	               uint32 pos = 0;
	               uint32 file_pos = 0;
				   
	               if(!indexbuf)
	               {
				mr_close(f);		
				return NULL;
	               }
	               nTmp = mr_seek(f, headbuf[3] - 16, MR_SEEK_CUR);//移动文件指针到文件索引开始的地方
	               if (nTmp < 0)
	               {
				mr_close(f);
				med_free_ext_mem((void **)&indexbuf);
					  
				return NULL;
	               }
               
			nTmp = mr_read(f, indexbuf, indexlen);
               
			if ((nTmp != (int32)indexlen))
			{
				mr_close(f);
				med_free_ext_mem((void **)&indexbuf);					  
				return NULL;
	               }
			
			memset(TempName,0,APS_MAX_FILENAME_SIZE);
			found = 0;
	               while(found < 2)/*这个循环用来在文件索引表中找到目标文件*/
	               {
				memcpy(&_v[0], &indexbuf[pos], 4);

				len = _ltoh((char*)_v);

				pos = pos + 4;
				if (((len + pos) > indexlen)||(len<1)||(len>=APS_MAX_FILENAME_SIZE))
				{
					mr_close(f);
					med_free_ext_mem((void **)&indexbuf);	
					return NULL;
				}
     
				/*取出文件索引表中的一个文件名*/
				memcpy(TempName, &indexbuf[pos], len);
				TempName[len] = 0;
                  
				pos = pos + len;
				if (strcmp(GB_FILE_NAME_1, TempName)==0)/*如果文件名相同*/
				{
					found ++;
					memcpy(&_v[0], &indexbuf[pos], 4);
					pos = pos + 4;
					file_pos = _ltoh((char*)_v); 

					memcpy(&_v[0], &indexbuf[pos], 4);
					pos = pos + 4;
					file_len = _ltoh((char*)_v);/*获得目标文件长度*/
					//WSL add 
					pos = pos + 4;
					if ((file_pos + file_len) > headbuf[2])
					{
						mr_close(f);
						med_free_ext_mem((void **)&indexbuf);	 
						return NULL;
					}
					else
					{
						//保存下来
						mr_dle_write_file_short(TempName,f,file_pos,file_len);				
					}
				}
				else if(strcmp(GB_FILE_NAME_2, TempName)==0)
				{
					found ++;
					memcpy(&_v[0], &indexbuf[pos], 4);
					pos = pos + 4;
					file_pos = _ltoh((char*)_v);

					memcpy(&_v[0], &indexbuf[pos], 4);
					pos = pos + 4;
					file_len = _ltoh((char*)_v);/*获得目标文件长度*/
					//WSL add 
					pos = pos + 4;
					if ((file_pos + file_len) > headbuf[2])
					{
						mr_close(f);
						med_free_ext_mem((void **)&indexbuf);	 
						return NULL;
					}
					else
					{
						//保存下来
						mr_dle_write_file_short(TempName,f,file_pos,file_len);						
					}
				}
				else
				{
					pos = pos + 12;
					if (pos >= indexlen)
					{
						mr_close(f);
						med_free_ext_mem((void **)&indexbuf);
       					return NULL;
					}
				}/*if (STRCMP(filename, TempName)==0)*/
			}

			med_free_ext_mem((void **)&indexbuf);              
			mr_close(f);			
			return NULL;
		}
	}

	return NULL;
}

void mr_dlc_unpack_files(void)
{ 
	//也许不需要下载GB码
	#ifndef __MR_CFG_FEATURE_MOPOZS_DOWNLOAD_GBTABLE__
		return ;
	#endif
	
	memset(g_dlc_temp_path,0,64);
	memset(g_dlc_temp_path_ucs,0,128);
	g_dlc_tmp0 = MMI_CARD_DRV;
	g_dlc_temp_path[0] = g_dlc_tmp0;
	sprintf(g_dlc_temp_path+1,":\\mythroad\\system\\%s",GB_FILE_NAME);
	mr_dlc_AnsiiToUnicodeString(g_dlc_temp_path_ucs,g_dlc_temp_path);
	mr_trace("mr_dlc_unpack_files,%s",g_dlc_temp_path);	
	GetFileFromMrp(g_dlc_temp_path_ucs);
	
}
static U8 Tolower( U8 ch )
{
   if( ch >='A' && ch <= 'Z' )
      return( ch + ('a' - 'A') );
   return ch;
}

/**
* index:0 or 1
*  0:GB
*  1:曲奇
* flag:0 or 1
*  0:不需要下载
*  1:需要下载
**/
void mr_dlc_set_flag(int32 index,int32 flag)
{
	g_dlc_need[index] = flag;
}

static void mr_dlc_init_data(void)
{
	mr_screeninfo screeninfo;
	mr_userinfo info ; 
	char tmp[128]; 
	memset(g_dlc_download_applist.pSendBuffer,0,1024);
	mr_getScreenInfo(&screeninfo);
	mr_getUserInfo(&info);
	if(g_dlc_flag == 1 )
	{
		sprintf(tmp,"hsman=%s&hstype=%s&hswidth=%d&hsheight=%d&hsplat=mtk&appid=%d",info.manufactory,info.type,screeninfo.width,screeninfo.height,300);
	}
	else 
	{
		sprintf(tmp,"hsman=%s&hstype=%s&hswidth=%d&hsheight=%d&hsplat=mtk&appid=%d",info.manufactory,info.type,screeninfo.width,screeninfo.height,800001);
	}
	g_dlc_download_applist.totalLen = sprintf((char*)g_dlc_download_applist.pSendBuffer,HTTP_HEADER,g_dlc_server,g_dlc_cmd,g_dlc_server,g_dlc_server);
	g_dlc_download_applist.totalLen += sprintf((char*)g_dlc_download_applist.pSendBuffer+g_dlc_download_applist.totalLen,"%d\r\n\r\n%s",strlen(tmp),tmp);
	mr_trace("mr_dlc_init_data,%d",g_dlc_download_applist.totalLen);
	g_dlc_download_applist.Sended = 0;
}

static void mr_dlc_string_to_lower(char *string, int32 len)
{
	int i=0;
	
	for(i=0;i<len;i++)
	{
		string[i] = Tolower(string[i]);
	}
}

extern char g_dsm_backup_entry[];
static void mr_dlc_free(void)
{
	int32 ineed_param = 0;
	if(g_dlc_download_applist.soc !=-1)
	{
		mr_closeSocket(g_dlc_download_applist.soc);
		g_dlc_download_applist.soc=-1;
	}
	mr_closeNetwork();
	
	if(g_dlc_download_applist.pRecvBuffer != NULL)
	{
		mr_mem_free_ex((void**)&g_dlc_download_applist.pRecvBuffer);
		g_dlc_download_applist.pRecvBuffer = NULL;
	}

	if(g_dlc_download_applist.pSendBuffer != NULL)
	{
		mr_mem_free_ex((void**)&g_dlc_download_applist.pSendBuffer);
		g_dlc_download_applist.pSendBuffer = NULL;
	}

	if(g_dlc_download_applist.pTmp!= NULL)
	{
		mr_mem_free_ex((void**)&g_dlc_download_applist.pTmp);
		g_dlc_download_applist.pTmp = NULL;
	}

	if(g_dlc_download_applist.fh != NULL)
	{
		FS_Close(g_dlc_download_applist.fh);
		g_dlc_download_applist.fh = NULL;
	}

	if(	g_dlc_timeout >= DLC_TIMEROUT_TOTAL)
	{
		GoBackHistory();	
		/*下载出错*/
		mmi_display_popup((UI_string_type)"\x0b\x4e\x7d\x8f\xfa\x51\x19\x95", 0);	
		g_dlc_timeout = 0;	
	}
	else if((g_dlc_download_applist.fileLeft ==0)&&(g_dlc_download_applist.pParam != NULL))
	{
		if((g_dlc_download_applist.showUI == 1) &&(GetActiveScreenId() == mr_dlc_get_down_screen_id()))
		{
			if((g_dlc_need[0] == 0)&&(g_dlc_need[1] == 0))
			{
				//都下载好了
				//需要先关掉当前的下载窗口.然后启动MRP,不在当前窗口不启动
				GoBackHistory();
				mr_fs_set_launch_dir(g_dlc_download_applist.pFileName[0],APPLIST_PATH);
				if(g_dlc_app_func != 0)
				{
					g_dlc_app_func();
					g_dlc_app_func = 0;
				}
				dsmEntry = (char *)g_dlc_download_applist.pParam;
				EntryDsmScreen();

				//解决QQ在第一次下载登陆成功后END键直接退出不能挂后台问题
				if(mr_app_get_state() != DSM_STOP && (strstr(g_dsm_backup_entry, "qq") ||strstr(g_dsm_backup_entry, "QQ")
				#ifdef __MMI_SKYQQ__
				|| strstr(g_dsm_backup_entry, "skyqq") ||strstr(g_dsm_backup_entry, "SKYQQ")
				#endif
				#ifdef __MMI_NGUAQ__
				|| strstr(g_dsm_backup_entry, "nguaq") ||strstr(g_dsm_backup_entry, "NGUAQ")
				#endif
				))
				{
					mr_backstage_hold_endkey(1);
				}

			}
		}
		//下完GB,还需要下曲奇
		if((g_dlc_need[1] == 1))
		{
			ineed_param = 1;
		}
	}
	else
	{
		if((g_dlc_download_applist.fileLeft > 0)&&(g_dlc_download_applist.showUI == 1) &&(GetActiveScreenId() == mr_dlc_get_down_screen_id()))
		{
			GoBackHistory();	
			/*下载出错*/
			mmi_display_popup((UI_string_type)"\x0b\x4e\x7d\x8f\xfa\x51\x19\x95", 0);
		}		
	}
	
	if((g_dlc_download_applist.fileLeft !=0)&&(g_dlc_download_applist.pFileName != NULL))
	{
		FS_Delete((WCHAR *)g_dlc_download_applist.pFileName);
	}
	
	if(g_dlc_download_applist.pFileName!= NULL)
	{
		mr_mem_free_ex((void**)&g_dlc_download_applist.pFileName);
		g_dlc_download_applist.pFileName = NULL;
	}
	
	if(ineed_param == 0)
	{
		if(g_dlc_download_applist.pParam!= NULL)
		{
			mr_mem_free_ex((void**)&g_dlc_download_applist.pParam);
			g_dlc_download_applist.pParam = NULL;
		}
	}

}

static void mr_dlc_applist_socket_notify();

static void mr_dlc_socket_run(void)
{
	U16 timerId = DSM_DL_APPLIST_SOCKET;

	StartTimer(timerId, 500, mr_dlc_applist_socket_notify);
}
static void mr_dlc_redown_server(void)
{
	g_dlc_download_applist.fileSize = 0;
	g_dlc_download_applist.fileLeft = 0;
	g_dlc_download_applist.flag = 0;
	g_dlc_download_applist.Recved = 0;
	mr_dlc_applist();
}

static void mr_dlc_applist_socket_notify()    
{
	int32 ret = 0;
	int32 soc_id = g_dlc_download_applist.soc; 
	
	if(soc_id == -1)
	{
		mr_dlc_free();
		return;
	} 
	if(g_dlc_download_applist.recvState == DL_CONNECTING)
	{
		ret = mr_net_check_connect(soc_id);
		if(ret == MR_SUCCESS)
		{
			g_dlc_timeout = 0;
			ret = mr_send(soc_id, (char*)g_dlc_download_applist.pSendBuffer,g_dlc_download_applist.totalLen);
			if((ret <0)&&(ret !=-2))
			{
				mr_dlc_free();
				return;
			}
			else
			{				
				g_dlc_download_applist.Sended =ret;
				if(g_dlc_download_applist.Sended >= g_dlc_download_applist.totalLen)
				{
					g_dlc_download_applist.recvState = DL_RECV_HTTP_HEADER;
				}
				else 
				{
					g_dlc_download_applist.recvState = DL_SENDING;
				}
			}
		}
		else if(ret == MR_FAILED)
		{
		 	mr_dlc_free();
			return;
		}
		else
		{
			//超时
			g_dlc_timeout++;
			if(g_dlc_timeout >= DLC_TIMEROUT_TOTAL)
			{
				mr_dlc_free();
				return;
			}
			
		}
	}
	else if(g_dlc_download_applist.recvState == DL_SENDING)
	{
		if(g_dlc_download_applist.Sended < g_dlc_download_applist.totalLen)
		{
			ret = mr_send(soc_id, (char *)g_dlc_download_applist.pSendBuffer+g_dlc_download_applist.Sended, g_dlc_download_applist.totalLen-g_dlc_download_applist.Sended);
			if((ret <0)&&(ret !=-2))
			{
				mr_dlc_free();
				return;
			}
			else
			{
				g_dlc_download_applist.Sended+=ret;
				if(g_dlc_download_applist.Sended >= g_dlc_download_applist.totalLen)
				{
					mr_mem_free_ex((void **)&g_dlc_download_applist.pSendBuffer);
					g_dlc_download_applist.pSendBuffer = NULL;
					g_dlc_download_applist.recvState = DL_RECV_HTTP_HEADER;
				}
				else 
				{
					g_dlc_download_applist.recvState = DL_SENDING;
				}
			}
		}

	}
	else
	{
		uint8 *p;
		uint8 *pLen;
		int i;
		
		ret = mr_recv(g_dlc_download_applist.soc,(char*)g_dlc_download_applist.pTmp,1024);
		if((ret <0)&&(ret !=-2)) /* socket错误 */
		{
			mr_dlc_free();
			return;
		}
	 	else if(ret == 0 || ret == SOC_WOULDBLOCK) /*  等待数据*/
		{
			g_dlc_timeout++;
			if(g_dlc_timeout >= DLC_TIMEROUT_TOTAL)
			{
				mr_dlc_free();
			}
			else
			{
				mr_dlc_socket_run();
			}
			return;
		}
		else
		{
			g_dlc_timeout = 0;
			if(g_dlc_download_applist.recvState == DL_RECV_DATA)
			{
				mr_dlc_write_data(g_dlc_download_applist.pTmp,ret);
				if(g_dlc_download_applist.fileLeft <=0)
				{
					mr_dlc_free();
					
					//有可能还要下曲奇
					if(g_dlc_need[1] == 1)
					{
						gui_start_timer(1000,mr_dlc_redown_server);
					}
					return;				
				}
			}
			else
			{
				if(g_dlc_download_applist.Recved+ret >4096) /*http 头大于4k的时候不支持*/
				{
					mr_dlc_free();
					return;
				}
				else
				{
					int32 errCode = 0;
					
					memcpy(g_dlc_download_applist.pRecvBuffer+g_dlc_download_applist.Recved,g_dlc_download_applist.pTmp,ret);
					g_dlc_download_applist.Recved +=ret;
					p = (uint8*)strstr((char*)g_dlc_download_applist.pRecvBuffer,"\r\n\r\n");
					if(p == NULL)
					{
						mr_dlc_free();
						return;
					}
					
					mr_dlc_string_to_lower((char*)g_dlc_download_applist.pRecvBuffer, p-g_dlc_download_applist.pRecvBuffer);
					
					errCode = atoi((char *)g_dlc_download_applist.pRecvBuffer+9);
					if(errCode != 200) // 网关返回错误
					{
						mr_dlc_free();
						return;
					}					
					
					pLen = (uint8*)strstr((char*)g_dlc_download_applist.pRecvBuffer,"content-length: ");
					if(pLen)
					{
						i =0;
						pLen += 16;
						memset(g_dlc_download_applist.pTmp,0,1024);
						while((*pLen) !='\r')
						{
							g_dlc_download_applist.pTmp[i]=*pLen;
							i++;
							pLen++;
						}
								
						g_dlc_download_applist.fileLeft = g_dlc_download_applist.fileSize = atoi((char*)g_dlc_download_applist.pTmp);
					}
					else
					{
						mr_dlc_free();
						return;
					}
					p+=4;
					if((p-g_dlc_download_applist.pRecvBuffer+5)>g_dlc_download_applist.Recved)
					{
						mr_dlc_free();
						return;
					}
					if(p[0] ==0x4d&&
					   p[1] == 0x52&&
					   p[2] == 0x50&&
					   p[3] == 0x47)
					{
						g_dlc_download_applist.recvState = DL_RECV_DATA;
						mr_dlc_write_data(p,g_dlc_download_applist.Recved-(p-g_dlc_download_applist.pRecvBuffer));
							
						mr_mem_free_ex((void **)&g_dlc_download_applist.pRecvBuffer);
						g_dlc_download_applist.pRecvBuffer = NULL;
					}
						
				}
			}
			
		}

	}
	mr_dlc_socket_run();
	return;
}
static int32 mr_dlc_host_callback(int32 ip)
{
	g_dlc_ip = ip;
	mr_dlc_connect_server();	
}
static void mr_dlc_get_host(void)
{
#ifndef __USE_TEST_SERVER__
	int32 ret = mr_getHostByName(g_dlc_server,mr_dlc_host_callback);
	if( ret > MR_WAITING)
	{
		//直接获得IP
		g_dlc_ip = ret;
		mr_dlc_connect_server();
	}
	else
	{
		//MR_WAITING or MR_FAILED
		if( ret ==  MR_FAILED)
		{
			//出错,客户需要就弹个框.默认不弹
			/*下载出错*/
			mmi_display_popup((UI_string_type)"\x0b\x4e\x7d\x8f\xfa\x51\x19\x95", 0);
		}
	}
#else
/* tst:http://115.238.91.240:10039/DownloadAppEx*/
//static int32 g_dlc_server_port = 10039;
	g_dlc_ip = 0x73EE5BF0;
	g_dlc_server_port = 10039;
	mr_dlc_connect_server();

#endif
}
static int32 mr_dlc_applist_initnet_cb(int32 ret)
{
	if(g_dlc_download_applist.soc ==-1)
	{
		//get host by name
		mr_dlc_get_host();
	//	mr_dlc_connect_server();
	}
}


char g_dlc_tmp1[64];
static int32 mr_dlc_open_file()
{
	mr_screeninfo scrinfo;
	mr_getScreenInfo(&scrinfo);
	
	if(g_dlc_download_applist.fh != NULL)
	{
		FS_Close(g_dlc_download_applist.fh);
		g_dlc_download_applist.fh = NULL;
	}
	
	if(g_dlc_download_applist.pFileName  != NULL)
	{
		mr_mem_free_ex((void**)&g_dlc_download_applist.pFileName);
		g_dlc_download_applist.pFileName = NULL;		
	}
	
	g_dlc_download_applist.pFileName = (uint8*)mr_mem_get_ex(128);
	if(g_dlc_download_applist.pFileName == NULL)
		return MR_FAILED;

	memset(g_dlc_tmp1,0,64);
	memset(g_dlc_download_applist.pFileName,0,128);
	g_dlc_tmp1[0] = g_dlc_tmp0;	
	if(g_dlc_flag == 0)
	{
		sprintf(g_dlc_tmp1+1,":\\%s\\plugin%d%d\\%s",APPLIST_PATH,scrinfo.width, scrinfo.height,APPLIST_FILE_NAME);
	}
	else
	{
		sprintf(g_dlc_tmp1+1,":\\%s\\system\\%s",APPLIST_PATH,GB_FILE_NAME);
	}
	
	mr_dlc_AnsiiToUnicodeString	((S8*)g_dlc_download_applist.pFileName,(S8*)g_dlc_tmp1);	
	g_dlc_download_applist.fh = FS_Open((WCHAR *)g_dlc_download_applist.pFileName,FS_CREATE|FS_READ_WRITE);
	if(g_dlc_download_applist.fh <0)
		return MR_FAILED;

	return MR_SUCCESS;
}
void mr_dlc_create_path(void)
{
	mr_screeninfo scrinfo;
	S16 DSMWORK_PATH[DSM_MAX_FILE_LEN+1] ={0};
	S8  fileBuf[DSM_MAX_NAME_LEN+1] ={0};
       int ret;
	//mythroad
	memset(fileBuf,0,DSM_MAX_NAME_LEN+1);
	memset(DSMWORK_PATH,0,(DSM_MAX_FILE_LEN+1)*sizeof(S16));
	sprintf(fileBuf, "%c:\\mythroad", g_dlc_tmp0);
	
	mr_dlc_AnsiiToUnicodeString( (char *)DSMWORK_PATH,(char*)fileBuf);

	ret = FS_GetAttributes((WCHAR *)DSMWORK_PATH);

	if((ret < 0)||(!(ret&FS_ATTR_DIR)))
	{
		FS_CreateDir((WCHAR *)DSMWORK_PATH);
	}

	//plugin
	mr_getScreenInfo(&scrinfo);
	sprintf(fileBuf, "%c:\\%s\\plugin%d%d",g_dlc_tmp0, mr_fs_get_work_path(),scrinfo.width, scrinfo.height);
	
	mr_dlc_AnsiiToUnicodeString( (char *)DSMWORK_PATH,(char*)fileBuf);

	ret = FS_GetAttributes((WCHAR *)DSMWORK_PATH); 

	if((ret < 0)||(!(ret&FS_ATTR_DIR)))
	{
		FS_CreateDir((WCHAR *)DSMWORK_PATH);
	}
	//system
	memset(fileBuf,0,DSM_MAX_NAME_LEN+1);
	memset(DSMWORK_PATH,0,(DSM_MAX_FILE_LEN+1)*sizeof(S16));
	sprintf(fileBuf, "%c:\\%s\\system", g_dlc_tmp0, mr_fs_get_work_path());
	
	mr_fs_separator_vm_to_local((U8 *)fileBuf); 
	mr_dlc_AnsiiToUnicodeString( (char *)DSMWORK_PATH,(char*)fileBuf);

	ret = FS_GetAttributes((WCHAR *)DSMWORK_PATH);

	if((ret < 0)||(!(ret&FS_ATTR_DIR)))
	{
		FS_CreateDir((WCHAR *)DSMWORK_PATH);
	}
	
}
static int32 mr_dlc_applist(void)
{
	int32 ret = MR_FAILED;
	if(GetDsmState() != 0)
		return MR_FAILED;
	//检查SIM CARD
				/*没有SIM卡,下不了*/
	if(!mmi_bootup_is_sim_valid() && !mmi_bootup_is_sim2_valid())
	{
		return MR_FAILED;
	}
	
	if(g_dlc_need[0] == 1)
	{
		g_dlc_flag = 1;
	}
	else if(g_dlc_need[1] == 1)
	{
		g_dlc_flag = 0;
	}
	else
	{
		//出错了,都有的情况下不应该跑到这块.
		return MR_FAILED;
	}
	mr_dlc_create_path();
	
	if(mr_dlc_open_file() == MR_FAILED)
		return MR_FAILED;
	
	mr_sim_initialize();
	
	g_dlc_download_applist.soc =-1;
	
	g_dlc_download_applist.pRecvBuffer = (uint8*)mr_mem_get_ex(4096);
	if(g_dlc_download_applist.pRecvBuffer == NULL)
		return MR_FAILED;

	g_dlc_download_applist.pTmp = (uint8*)mr_mem_get_ex(1024);
	if(g_dlc_download_applist.pTmp ==NULL)
	{
		mr_dlc_free();
		return MR_FAILED;
	}
	
	g_dlc_download_applist.pSendBuffer = (uint8*)mr_mem_get_ex(1024);
	if(g_dlc_download_applist.pSendBuffer ==NULL)
	{
		mr_dlc_free();
		return MR_FAILED;
	};

	g_dlc_download_applist.flag =0;
	mr_dlc_init_data();
	mr_sim_initialize();
	ret = mr_initNetwork(mr_dlc_applist_initnet_cb,"CMNET");
	kal_prompt_trace(MOD_MMI,"mr_initNetwork,%d",ret);
	if(MR_FAILED == ret)
	{
		//弹框,出错了
		//出错,客户需要就弹个框.默认不弹
		/*下载出错*/
		mmi_display_popup((UI_string_type)"\x0b\x4e\x7d\x8f\xfa\x51\x19\x95", 0);
	}
	else if(ret == MR_SUCCESS)
	{
		//直接成功了.
		mr_dlc_applist_initnet_cb(1);
	}
	return MR_SUCCESS;
}
 
static void mr_dlc_write_data(uint8 *data,int32 len)
{
	int32 wlen;
	UINT l;
	if(len <=0)
		return;
	if(g_dlc_download_applist.fileLeft< len)
		wlen = g_dlc_download_applist.fileLeft;
	else
		wlen = len;

	if(FS_NO_ERROR != FS_Write(g_dlc_download_applist.fh, (void *)data,wlen,&l))
	{
		//写文件出错
		mr_dlc_free();
		return;
	}
	g_dlc_download_applist.fileLeft -= wlen;

	if(g_dlc_download_applist.showUI)
	{
		mr_dlc_update_progress(g_dlc_download_applist.fileSize,g_dlc_download_applist.fileLeft);	
	}
	
	if(g_dlc_download_applist.fileLeft==0)
	{
		if(g_dlc_flag == 1)
		{
			g_dlc_need[0] = 0;	
			if(g_dlc_download_applist.fh != NULL)
			{
				FS_Close(g_dlc_download_applist.fh);
				g_dlc_download_applist.fh = NULL;
			}

			mr_dlc_unpack_files();
		}
		else if(g_dlc_flag == 0)
		{
			g_dlc_need[1] = 0;
		}
		mr_dlc_free();
	}
}

void mr_dlc_start_app(char *param,mr_app_entry_f app_func)
{
	int32 ret;
	int drv; 
	mr_screeninfo scrinfo;
	mr_getScreenInfo(&scrinfo);
	if(g_dlc_download_applist.pParam != NULL)
		mr_mem_free_ex((void**)&g_dlc_download_applist.pParam);
	
	g_dlc_download_applist.pParam = (uint8*)mr_mem_get_ex(64);
	if(g_dlc_download_applist.pParam == NULL)
		return;

	if(param == NULL)
	{
		sprintf((char*)g_dlc_download_applist.pParam, "%%plugin%d%d/cookie.mrp", scrinfo.width, scrinfo.height);
	}
	else
	{
		sprintf((char*)g_dlc_download_applist.pParam, "%%plugin%d%d/cookie.mrp,%s", scrinfo.width, scrinfo.height,param);
	}
	g_dlc_app_func = app_func;
	if(g_dlc_download_applist.soc ==-1) /*不在下载*/
	{
		g_dlc_download_applist.fileSize = 0;
		g_dlc_download_applist.fileLeft = 0;
		g_dlc_download_applist.flag = 0;
		g_dlc_download_applist.Recved = 0;

		drv =g_dlc_tmp0;
		
		{
			if((g_dlc_need[0] == 1)&&(g_dlc_need[1] == 1))
			{
				g_dlc_meger_prograss = 1;
			}
			else
			{
				g_dlc_meger_prograss = 0;
			}
			if(mr_dlc_applist() == MR_SUCCESS) 
			{
				g_dlc_download_applist.showUI = 1;
				mr_dlc_update_progress(0,0);
			}
			else
			{
				//出错,客户需要就弹个框.默认不弹
				/*下载出错*/
				mmi_display_popup((UI_string_type)"\x0b\x4e\x7d\x8f\xfa\x51\x19\x95", 0);
			}
		}
	}
	else
	{
		g_dlc_download_applist.showUI = 1;
		mr_dlc_update_progress(g_dlc_download_applist.fileSize,g_dlc_download_applist.fileLeft);
	}
}

void mr_dlc_get_progress(int32 *total,int32 *left)
{
	if(total&&left)
	{
		*total = g_dlc_download_applist.fileSize;
		*left = g_dlc_download_applist.fileLeft;
	}
}


void mr_dlc_exit_dl(void)
{
	g_dlc_download_applist.showUI	=0;
}

extern char *mr_fs_get_work_path(void);

int mr_dlc_check_applist(void)
{
	char drv[2];
	int i =0;
	int ret;
	uint8 tmp[13] = {0};
	uint32 fileSize;
	char tmp1[64] = {0};
	char tmpucs[128] = {0};
	int32 fh = -1;
	mr_screeninfo scrinfo;
	mr_getScreenInfo(&scrinfo);


	drv[0] = mr_dlc_get_card_drv();
	drv[1] = mr_dlc_get_public_drv();
	
	for(i=0;i<2;i++)
	{
		memset(tmp1,0,64);
		memset(tmpucs,0,128);
		tmp1[i] = drv[i];
		sprintf(tmp1+1,":\\%s\\plugin%d%d\\%s",APPLIST_PATH,scrinfo.width, scrinfo.height,APPLIST_FILE_NAME);
		mr_dlc_AnsiiToUnicodeString	((S8*)tmpucs,(S8*)tmp1);

		fh = FS_Open((WCHAR *)tmpucs,MR_FILE_RDONLY);
		
		if (fh <FS_NO_ERROR)
			return 0;
		
		ret = FS_GetFileSize( fh, &fileSize);
		if (ret < FS_NO_ERROR)
		{
			FS_Close(fh);
			return 0;
		}
		if(fileSize > 0)
		{
			mr_read(fh, (void *)tmp,12);
			tmp[4] ='\0';
			if((strcmp((char *)tmp,"MRPG") ==0)&&(fileSize == ((tmp[8])+(tmp[9]<<8)+(tmp[10]<<16)+(tmp[11]<<24))))
			{
				FS_Close(fh);
				return drv[i];
			}
		}
		FS_Close(fh);
		fh = -1;
		FS_Delete(( WCHAR *) tmpucs);  
	}
	
	return 0;
}
 



static void mr_dlc_connect_server(void)
{
	g_dlc_download_applist.soc = mr_socket(MR_SOCK_STREAM,0);
	if(g_dlc_download_applist.soc ==-1)
	{
		mr_dlc_free();
		return;
	}

	g_dlc_download_applist.recvState = DL_CONNECTING;
	memset(g_dlc_download_applist.pRecvBuffer,0,4096);
	g_dlc_download_applist.Sended = 0;
	
	mr_connect(g_dlc_download_applist.soc,g_dlc_ip, g_dlc_server_port, MR_SOCKET_NONBLOCK);
	mr_dlc_socket_run();
}
//Rocket.chen add 2011-08-13,start
static U8 dsm_bg_opacity;
BOOL is_mr_dlc_download = FALSE;
static void mr_dlc_exit_dl_screen(void)
{
	mr_dlc_exit_dl();
    dm_set_scr_bg_opacity(dsm_bg_opacity);
}

void mr_set_bg_opacity(void)
{
    dm_set_scr_bg_opacity(dsm_bg_opacity);
}
//Rocket.chen add 2011-08-13,end

static void mr_dlc_entry_dsm_dl(void)
{
	U8 *gui_buffer;
	S32 iBufLength;
	int32 progress = 0;
	int32 total = 0,left = 0;
	
	
	mr_dlc_get_progress(&total,&left);
	if(total ==0)
		progress =0;
	else
		progress = ((total-left)*100)/total;
	
	//Rocket.chen add 2011-08-13 start
	if (GetDsmState()== DSM_STOP || GetDsmState() == DSM_BACK_RUN )
	{
		is_mr_dlc_download = TRUE;
		dm_get_scr_bg_opacity(&dsm_bg_opacity);
	}
	//Rocket.chen add 2011-08-13 end
		
	memset(g_dlc_info,0,__DLC_INFO_SIZE);
	memset(g_dlc_progressInfo,0,__DLC_INFO_SIZE*2+2);
	sprintf(g_dlc_info,"%02d%%...",progress);
	mr_dlc_AnsiiToUnicodeString((S8 *) g_dlc_progressInfo, (S8 *) g_dlc_info);	
	wcscat((WCHAR*)g_dlc_progressInfo, (WCHAR*)"\xbe\x7c\x69\x5f\x85\x51\xb9\x5b\x63\x6b\x28\x57\x0b\x4e\x7d\x8f\x2c\x00\xf7\x8b\x0d\x7a\x19\x50");

	
	iBufLength = mmi_ucs2strlen(g_dlc_progressInfo) * sizeof(U8);
	gui_buffer = (U8 *)mmi_frm_scrn_get_gui_buf(mr_app_get_group_id(),mr_dlc_get_down_screen_id());

	mr_app_EntryNewScreen(mr_dlc_get_down_screen_id(),mr_dlc_exit_dl_screen, mr_dlc_entry_dsm_dl,MMI_FRM_FULL_SCRN);
	mr_dlc_ShowCategory((U8*)g_dlc_progressInfo,iBufLength,gui_buffer);
	#if 0
	ShowCategory74Screen(STR_GLOBAL_PLEASE_WAIT, 0,0, 0,
								STR_GLOBAL_BACK, IMG_GLOBAL_BACK,
								(U8*)g_dlc_progressInfo, iBufLength,gui_buffer );
	#endif
	ChangeLeftSoftkey(NULL,NULL);
	SetRightSoftkeyFunction(GoBackHistory,KEY_EVENT_UP);		
}
void mr_dlc_update_progress(int32 total,int32 left)
{
	if(GetActiveScreenId() == mr_dlc_get_down_screen_id())
	{
		int32 progress;
		U8 *gui_buffer;
		S32 iBufLength;	
		if(total ==0)
			progress =0;
		else
			progress = ((total-left)*100)/total;
			
		if(g_dlc_meger_prograss == 1)
		{
			if(g_dlc_flag == 1)
			{
				progress = progress  / 5;
			}
			else
			{
				progress = 20+progress *4 / 5;
//				progress = 20+progress *80 / 100
			}
		}
		memset(g_dlc_info,0,__DLC_INFO_SIZE);
		memset(g_dlc_progressInfo,0,__DLC_INFO_SIZE*2+2);
		sprintf(g_dlc_info,"%02d%%...",progress);
		mr_dlc_AnsiiToUnicodeString((S8 *) g_dlc_progressInfo, (S8 *) g_dlc_info);	
		wcscat((WCHAR*)g_dlc_progressInfo, (WCHAR*)"\xbe\x7c\x69\x5f\x85\x51\xb9\x5b\x63\x6b\x28\x57\x0b\x4e\x7d\x8f\x2c\x00\xf7\x8b\x0d\x7a\x19\x50");
		
		iBufLength = mmi_ucs2strlen(g_dlc_progressInfo) * sizeof(U8);
		gui_buffer = (U8 *)mmi_frm_scrn_get_gui_buf(mr_app_get_group_id(),mr_dlc_get_down_screen_id());

		//解决在下载过程中返回主菜单显示异常的问题
		UI_common_screen_exit();
		UI_common_screen_pre_exit();
		
		mr_dlc_ShowCategory((U8*)g_dlc_progressInfo,iBufLength,gui_buffer);
		#if 0
		ShowCategory74Screen(STR_GLOBAL_PLEASE_WAIT, 0,0, 0,
									STR_GLOBAL_BACK, IMG_GLOBAL_BACK,
									(U8*)g_dlc_progressInfo, iBufLength,gui_buffer );
		#endif
		SetRightSoftkeyFunction(GoBackHistory,KEY_EVENT_UP);		
	}
	else if (mmi_frm_scrn_is_present(mr_app_get_group_id(),mr_dlc_get_down_screen_id(),MMI_FRM_FULL_SCRN))	
	{
		return;
	}
	else
	{
		mr_dlc_entry_dsm_dl();
	}
}

int32 mr_dlc_check_GB(void)
{
	char drv[2];
	int i =0;
	int ret;
	uint8 tmp[13] = {0};
	uint32 fileSize;
	char tmp1[64] = {0};
	char tmpucs[128] = {0};
	int32 fh = -1;
	mr_screeninfo scrinfo;

	//也许不需要下载GB码
	#ifndef __MR_CFG_FEATURE_MOPOZS_DOWNLOAD_GBTABLE__
		return g_dlc_tmp0;
	#endif
	
	mr_getScreenInfo(&scrinfo);
	drv[0] = mr_dlc_get_card_drv();
	drv[1] = mr_dlc_get_public_drv();
	
	for(i=0;i<2;i++)
	{
		memset(tmp1,0,64);
		memset(tmpucs,0,128);
		tmp1[i] = drv[i];
		sprintf(tmp1+1,":\\mythroad\\system\\%s",GB_FILE_NAME);
		mr_dlc_AnsiiToUnicodeString	((S8*)tmpucs,(S8*)tmp1);

		fh = FS_Open((WCHAR *)tmpucs,MR_FILE_RDONLY);
		
		if (fh <FS_NO_ERROR)
			return 0;
		
		ret = FS_GetFileSize( fh, &fileSize);
		if (ret < FS_NO_ERROR)
		{
			FS_Close(fh);
			return 0;
		}
		if(fileSize > 0)
		{
			mr_read(fh, (void *)tmp,12);
			tmp[4] ='\0';
			if((strcmp((char *)tmp,"MRPG") ==0)&&(fileSize == ((tmp[8])+(tmp[9]<<8)+(tmp[10]<<16)+(tmp[11]<<24))))
			{
				FS_Close(fh);
				return drv[i];
			}
		}
		FS_Close(fh);
		fh = -1;
		FS_Delete(( WCHAR *) tmpucs);  
	}
	
	return 0;
}

int32 mr_dlc_get_slot(void)
{
	char tmp1[64];
	int ret;
	U64 ffsFree;
	FS_DiskInfo diskInfo;

	tmp1[0] = mr_dlc_get_card_drv();
	tmp1[1] ='\0';
	tmp1[2] = ':';
	tmp1[3] = '\0';
	tmp1[4] = '\\';
	tmp1[5] = '\0';
	
	ret = FS_GetDiskInfo((uint16*)tmp1, &diskInfo, FS_DI_BASIC_INFO|FS_DI_FREE_SPACE);

	if(ret <0)
		return 0;
	
	ffsFree = diskInfo.FreeClusters*diskInfo.SectorsPerCluster*diskInfo.BytesPerSector;

	if(ffsFree <500*1024)
	{
		tmp1[0]= mr_dlc_get_public_drv();
		ret = FS_GetDiskInfo((uint16*)tmp1, &diskInfo, FS_DI_BASIC_INFO|FS_DI_FREE_SPACE);
		if(ret <0)
			return 0;
		ffsFree = diskInfo.FreeClusters*diskInfo.SectorsPerCluster*diskInfo.BytesPerSector;
		if(ffsFree<500*1024)
			return 0;
	}
	g_dlc_tmp0 = tmp1[0];
	return tmp1[0];
}
/**
*  检查是否需要下载GB码或者是曲奇.
**/
int32 mr_dlc_check_download(void)
{
	char list = 0;
	char gb = 0;
	char free = 0;
	free = mr_dlc_get_slot();
	mr_dlc_create_path();
	//是否要下载曲奇
	list = mr_dlc_check_applist();
	if(list > 0)
	{	
		g_dlc_need[1] = 0;
	}
	else
	{
		g_dlc_need[1] = 1;
	}
	gb = mr_dlc_check_GB();
	if(gb > 0)
	{
		g_dlc_need[0] = 0;
	}
	else
	{
		g_dlc_need[0] = 1;
	}
	if((g_dlc_need[0] == 0)&&(g_dlc_need[1] == 0))
	{
		//不需要下载
		if(gb == list)
		{
			g_dlc_tmp0 = free;
			//for safe
			mr_dlc_unpack_files();
			return 1;
		}
	}
	else
	{
		//有需要下载的,统一到一个盘符
		if(free > 0)
		{
			g_dlc_tmp0 = free;
			if(list != free)
			{
				g_dlc_need[1] = 1;
			}
			else
			{
				g_dlc_need[1] = 0;
			}
			if(free != gb)
			{
				g_dlc_need[0] = 1;
			}
			else
			{
				g_dlc_need[0] = 0;
				//for safe
				mr_dlc_unpack_files();
			}
		}
	}
	return 0;
}


#endif

#endif

